/*
 * CliqueLifter.h
 *
 *  Created on: Jan 24, 2014
 *      Author: ik
 */

#ifndef CLIQUELIFTER_H_
#define CLIQUELIFTER_H_

#include <Grafo.h>
#include <Cliquer.h>
#include <Desigualdad.h>

using namespace std;

class CliqueProyectada : public UnmodifiableVertexSet
{
	private:
		Grafo* 		_lazy;

	public:
		CliqueProyectada(VertexSet* clique, Grafo* lazy) : UnmodifiableVertexSet(*clique), _lazy(lazy)	{};
		virtual ~CliqueProyectada() { delete _lazy;	};
		Grafo* getGrafoFalso(){ return _lazy;   }
};

class CliqueLifter
{
protected:
	Grafo& 				_grafo;
	Cliquer& 			_cliquer;
	vector<VertexSet *>	_unionvecindades;
	VertexSet 			_candidatos;

	virtual int calculaLambda(const VertexSet& soporte, const IntValueArray& coeficientes, VertexSet& proyectada, int pi) = 0;

public:
	CliqueLifter(Grafo &grafo, Cliquer &cliquer);
	virtual ~CliqueLifter();

	bool lift(Desigualdad *dv, VertexSet *W);
	bool lift(Desigualdad * ret, vector<CliqueProyectada*> proyecciones);
};


#endif /* CLIQUELIFTER_H_ */
